package com.atguigu.lease.web.admin.custom.converter;

import com.atguigu.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;

/**
 * @Author: luochao
 * @CreateTime: 2025-02-19
 * @Description:
 * @Version: 1.0
 */
@Component
// 自定义转换器工厂，controller方法在执行类型转换期间的类型转换过程中，
// 会调用 getConverter 方法，传入目标类型，然后返回一个 Converter 对象，用于执行类型转换。
// 实现 ConverterFactory 接口，指定源类型为 String，目标类型为 BaseEnum
public class StringToBaseEnumConverterFactory implements ConverterFactory<String, BaseEnum> {

    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        return new Converter<String, T>() {
            //重写接口中的抽象方法
            @Override
            public T convert(String source) {
                //Class.getEnumConstants() 方法是 Java 反射 API 中的一个方法，用于获取表示枚举类型的 Class 对象中所有枚举常量的数组
                for (T enumConstant : targetType.getEnumConstants()) {
                    if (enumConstant.getCode().equals(Integer.valueOf(source))) {
                        return enumConstant;
                    }
                }
                throw new IllegalArgumentException("非法的枚举值:" + source);
            }
        };
    }
}
